//
// Created by Lenovo on 2023/3/12.
//

/* 洛谷 P3375 */
/* KMP 算法 */

/* 借助于 next 数组，使得在匹配失败时，直接把模式串的指针移到对应的位置，而不用回溯主串的指针，节省时间
 * next 数组里的值，就是 ？*/

#include <stdio.h>
#include <string.h>
#define MAXN 1000050

char s1[MAXN], s2[MAXN];
int next[MAXN];// next[i] 表示的是在模式串中，第 1 个字符到第 i - 1 个字符的最长前后缀 - 前缀和后缀一样

void getNext() //注意：next[3] 其实是前 3 个字符中的最长前后缀
{
    int j = 0, k = -1;// j，k 都是指向模式串的指针，k 同时也是对应当前字串的 next 值
    next[j] = k;//便于计算，next[0] = -1
    while (s2[j])
    {
        if (k == -1 || s2[j] == s2[k]) //不能简单理解成 j == 1, k == 0，因为此时不一定匹配的上
                                       //实际上是想比较模式串的前后两个部分，如果下一位相同，那么 next 数组的下一位就 +1
        {
            j++;
            k++;
            next[j] = k;// next[1] = 0
        }
        else //如果下一位不同，那么 k 就要回退到 next[k]，就是上一次与后面的字符串的前面(除了最后一位)都匹配的子串的下一位，和 j 继续比
        {
            k = next[k];
        }
    }
}

void kmp(int len)
{
    int i = 0, j = 0;// i 指向主串，j 指向模式串
    while (s1[i])
    {
        int flag = 1;
        while (j < len)
        {
            if (j == -1 || s1[i] == s2[j]) // j 指到 -1，说明所有字符都没有匹配，这个时候 i++
            {
                i++;
                j++;
            }
            else
            {
                flag = 0;
                break;
            }
        }
        if (flag)
        {
            printf("%d\n", i - j + 1);
        }
        j = next[j];// j -= j - next[j]; 模式串回退
    }

}

int main()
{
    scanf("%s %s", s1, s2);
    int len = strlen(s2);

    getNext();
    kmp(len);

    for (int i = 0; i < len; i++)
    {
        if (i == 0)
        {
            printf("0 ");
        }
        else
        {
            printf("%d ", next[i + 1]);
        }
    }

    return 0;
}